package com.Shuang.Demo1;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.File;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;

/***需求**
        * 某小型商城系统的订单信息在**素材下的orders.xml文件中**，现在要求把xml中的订单信息，封装成一个一个的订单对象，将订单对象保存到ArrayList集合中。
        **具体功能点要求**
        1) 定义订单类Order，创 建ArrayList集合，用于存储订单Order对象
        2）请使用Stream流找出今天之前的订单，并遍历输出。
        3) 请使用Stream流找出集合中价格最贵的订流单，把这个订单的详细信息打印出来。
        4) 请使用Stream流遍历集合中的每个订单，要求按照价格降序输出每个订单的详情。
 */

public class Test {
    public static void main(String[] args) throws Exception {
        //1 创建集合用于存储Order对象
        List<Order> orders = new ArrayList<>();

        //2 导入dom4j框架 用于解析orders.xml 中的订单类成订单对象出来
        SAXReader saxReader = new SAXReader();

       //3 利用dom4j 读取xml文件成为一个Document对象
//        Document document = saxReader.read(  //用当前类这个方法读路径  ”/“ 代表去读src文件下的
//                Test.class.getResourceAsStream("/orders.xml"));
        Document document = saxReader.read(
                new File("ExamFinal\\src\\orders.xml"));

        //4 利用文件得到根目录
        Element rootElement = document.getRootElement();

        //5 用根目录找她下面的所有一级order元素
        List<Element> orderElements = rootElement.elements();

        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

        //6 遍历拿到的所有一级order元素得到其中的各个属性 设置给每个order对象中去再把order对象添加到集合中
        for (Element orderElement : orderElements) {
            // 先把订单对象创建出来
            Order order = new Order();

            //拿到一级order元素自己的属性 ---> id 本来是字符串转为在整数
            int id = Integer.valueOf(orderElement.attributeValue("id"));
            order.setId(id);

            //分别拿到名字 时间 价格都设置到订单对象中去
            String name = orderElement.elementText("name");
            order.setName(name);

            String Stime = orderElement.elementText("time");
            //解析字符串 time
            LocalDateTime time = LocalDateTime.parse(Stime, dtf);
            order.setTime(time);

            Double price = Double.valueOf(orderElement.elementText("double"));
            order.setPrice(price);

            //设置完了添加到集合中去
            orders.add(order);
        }

        System.out.println("所有订单内容如下：");
        for (Order order : orders) {
            System.out.println(order);
        }

        //7 请使用Stream流找出今天之前的订单，并遍历输出。 o代表拿到所有订单
        System.out.println("今天之前的订单如下：");
        orders.stream().filter(o -> o.getTime().isBefore(LocalDateTime.now()))
                .forEach(System.out::println);

        //8 请使用Stream流找出集合中价格最贵的订流单，把这个订单的详细信息打印出来。
        System.out.println("价格最贵的订单如下：");
        Optional<Order> max = orders.stream().max((o1, o2) -> Double.compare(o1.getPrice(), o2.getPrice()));
        Order orderMaxPrice = max.get();
        System.out.println(orderMaxPrice);

        //9 请使用Stream流遍历集合中的每个订单，要求按照价格降序输出每个订单的详情。
        System.out.println("订单按照价格降序输出如下：");
        orders.stream().sorted((o1, o2) -> Double.compare(o2.getPrice(), o1.getPrice()))
                .forEach(o -> System.out.println(o));


    }
}
